﻿using System;
using System.Collections.Generic;
using System.Drawing;
using Graphic = Ribbon.Core.Graphics.GraphicHelper;

namespace Ribbon.Core
{
    public abstract class RibbonPageBase
    {
        public virtual Ribbon Parent { get; set; }

        public virtual Font Font { get; set; }

        public virtual SizeF TextSize { get; set; }

        public virtual Rect Rect { get; set; }

        public virtual Bitmap Image { get; set; }

        public virtual Color BackColor { get; set; }

        public virtual Color ForeColor { get; set; }

        public virtual Color SelectBackColor { get; set; }

        public virtual Color SelectForeColor { get; set; }

        public virtual float Radiu { get; set; }

        public virtual string Text { get; set; }

        public virtual string Name { get; set; }

        public virtual bool IsActive { get; set; }

        public virtual bool IsMouseHover { get; set; }

        public abstract void OnPaint(System.Drawing.Graphics g);

        internal abstract void GetSize();
    }

    public class RibbonPageCollection : IList<RibbonPageBase>
    {
        public RibbonPageCollection(Ribbon parent)
        {
            this.Parent = parent;

            this.Pages = new List<RibbonPageBase>();
        }

        Ribbon Parent;

        List<RibbonPageBase> Pages { get; set; }

        public int IndexOf(RibbonPageBase item)
        {
            return Pages.IndexOf(item);
        }

        public void Insert(int index, RibbonPageBase item)
        {
            Pages.Insert(index, item);
        }

        public void RemoveAt(int index)
        {
            Pages.RemoveAt(index);
        }

        public RibbonPageBase this[int index]
        {
            get
            {
                return Pages[index];
            }
            set
            {
                Pages[index] = value;
            }
        }

        public void Add(RibbonPageBase item)
        {
            item.Parent = this.Parent;

            Pages.Add(item);

            Parent.Refresh();

            if (this.Parent.ActivePage == null)
            {
                if (item is RibbonPage)
                {
                    item.IsActive = true;
                    this.Parent.ActivePage = item as RibbonPage;
                } 
            }
        }

        public void AddRange(params RibbonPageBase[] pages)
        {
            foreach (RibbonPageBase item in pages)
            {
                item.Parent = this.Parent;

                Pages.Add(item);

                if (this.Parent.ActivePage == null)
                {
                    if (item is RibbonPage)
                    {
                        item.IsActive = true;
                        this.Parent.ActivePage = item as RibbonPage;
                    } 
                }
            }

            Parent.Refresh();
        }

        public void Clear()
        {
            Pages.Clear();
        }

        public bool Contains(RibbonPageBase item)
        {
            return Pages.Contains(item);
        }

        public void CopyTo(RibbonPageBase[] array, int arrayIndex)
        {
            throw new NotImplementedException();
        }

        public int Count
        {
            get { return Pages.Count; }
        }

        public bool IsReadOnly
        {
            get { return false; }
        }

        public bool Remove(RibbonPageBase item)
        {
            return Pages.Remove(item);
        }

        public IEnumerator<RibbonPageBase> GetEnumerator()
        {
            return Pages.GetEnumerator();
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return Pages.GetEnumerator();
        }
    }


    //public class RibbonPageButtonCollection : IList<RibbonPageButton>
    //{
    //    public RibbonPageButtonCollection(Ribbon parent)
    //    {
    //        this.Parent = parent;

    //        this.Buttons = new List<RibbonPageButton>();
    //    }

    //    Ribbon Parent;

    //    List<RibbonPageButton> Buttons { get; set; }

    //    public int IndexOf(RibbonPageButton item)
    //    {
    //        return Buttons.IndexOf(item);
    //    }

    //    public void Insert(int index, RibbonPageButton item)
    //    {
    //        Buttons.Insert(index, item);
    //    }

    //    public void RemoveAt(int index)
    //    {
    //        Buttons.RemoveAt(index);
    //    }

    //    public RibbonPageButton this[int index]
    //    {
    //        get
    //        {
    //            return Buttons[index];
    //        }
    //        set
    //        {
    //            Buttons[index] = value;
    //        }
    //    }

    //    public void Add(RibbonPageButton item)
    //    {
    //        item.Parent = this.Parent;

    //        Buttons.Add(item);

    //        Parent.Refresh();
    //    }

    //    public void AddRange(params RibbonPageButton[] pages)
    //    {
    //        foreach (RibbonPageButton item in pages)
    //        {
    //            item.Parent = this.Parent;

    //            Buttons.Add(item);
    //        }

    //        Parent.Refresh();
    //    }

    //    public void Clear()
    //    {
    //        Buttons.Clear();
    //    }

    //    public bool Contains(RibbonPageButton item)
    //    {
    //        return Buttons.Contains(item);
    //    }

    //    public void CopyTo(RibbonPageButton[] array, int arrayIndex)
    //    {
    //        throw new NotImplementedException();
    //    }

    //    public int Count
    //    {
    //        get { return Buttons.Count; }
    //    }

    //    public bool IsReadOnly
    //    {
    //        get { return false; }
    //    }

    //    public bool Remove(RibbonPageButton item)
    //    {
    //        return Buttons.Remove(item);
    //    }

    //    public IEnumerator<RibbonPageButton> GetEnumerator()
    //    {
    //        return Buttons.GetEnumerator();
    //    }

    //    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    //    {
    //        return Buttons.GetEnumerator();
    //    }
    //}

}
